home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
ctrl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-04
|
34KB
|
1,549 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
void
ctrl_at()
{
}
void
ctrl_a()
{
CX0 = CPX = 0; /* 行頭へ */
work_cursor_cpx();
}
void
ctrl_b()
{
if (TBUFFC || TBUFFC_R) {
xf_ikinari_kakutei();
}
ctrl_b0();
}
/* バックしたら1を返す */
int
ctrl_b0()
{
UNIT *up;
int flag = 1;
if (TBUFFC) { /* 変換バッファの右端を確定し、バッファを短くする */
UBYTE w0[VERY_LONG_LINE*4];
UINT c,l;
c = xf_back_tb();
if (TBCP) { /* 生がある */
xf_disp_insert(&TX,&TY);
} else { /* 生が無くなった */
work_replace_str_echo(TL0,TBP0,TL1,TBP1,TBUFF,0,TY0);
xf_init_tb();
etc_color(NORMAL);
disp_half_flush(TL0,TY0);
}
return;
}
if (!CPX) { /* 前行へ */
up = CL->MAE;
if (up != HEAD) {
CL = up;
line_cl_cl();
if (--CY < 0) { /* ウインドウ外 */
/* CL をウインドウの中心にして書き直す */
disp_cl_center();
}
work_line_analyze();
CPX = work_CX0_to_CPX(VERY_LONG_LINE); /* 行末へ */
} else {
/* 何もしない */
flag = 0;
}
} else {
CPX--;
}
work_cursor_cpx();
CX0 = CX;
return(flag);
}
/* 右側に半角スペースを挿入 */
void
ctrl_c()
{
work_insert1_right('\x20');
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
}
/* 吸い込みデリート */
void
ctrl_d()
{
UBYTE c;
if (((c = line_cpx_1byte()) == EOS) || (c == CR)) { /* 改行若しくは右端 */
if (CL == (TAIL->MAE)) { /* 何もしない */
return;
}
if (c) { /* 行の右端ではない */
work_delete1char();
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
CX0 = CX;
} else { /* 行の右端である */
/* 次の行の左端を削除 */
work_delete1char_special();
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
CX0 = CX;
}
} else {
work_delete1char();
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
CX0 = CX;
}
change_check();
disp_trim_tail();
/* disp_half_flush(CL,CY);*/
/*
window0();
printf("(%x)(%x)(%x)(%x)(%x)(%x)(%x)(%x)",
SCREEN[0],SCREEN[1],SCREEN[2],SCREEN[3],SCREEN[4],SCREEN[5],SCREEN[6],SCREEN[7]);
*/
}
void
ctrl_e()
{
CPX = work_CX0_to_CPX(VERY_LONG_LINE); /* 行末へ */
work_cursor_cpx();
CX0 = CX;
}
void
ctrl_f()
{
if (TBUFFC) {
register UINT c,cl;
if (TBUFFC == TBCP) { /* 右側の確定はない */
/* 新しく1文字持ってきて追加する */
c = line_cpx_code();
if (xf_append_tb_check(c)) {/* 変換バッファが一杯 */
under_print((STR)"変換バッファが一杯です");
etc_beep();
return;
}
if ((c == CR) || (!c)){ /* 行の右端である */
if ((c == CR) || (CL->ATO == TAIL)) {
etc_beep();
return;
}
ctrl_f0();
c = line_cpx_code();
}
ctrl_f0();
TL1 = CL; /* 変換バッファの終了行 */
TPX1 = CPX;
TX1 = CX;
TY1 = CY;
TBP1 = ANALYZE[CPX].BPOS;
xf_append_tb(c);
} else { /* 右側の確定がある */
/* TBCP を1つ進める */
xf_forward_tb();
}
} else {
ctrl_f0();
}
}
/* カーソル右 */
void
ctrl_f0()
{
UBYTE c;
if (((c = line_cpx_1byte()) == EOS) || (c == CR)) { /* 次行へ */
if (CL->ATO != TAIL) {
if ((CY+1) > (CWY1 - CWY0)) { /* ウインドウ外 */
/* 袋を空にし、CL をウインドウの中心-1にして書き直す */
line_seigyou();
disp_cl_center_1();
}
CY++;
CL = CL->ATO;
CPX = 0;
line_cl_cl();
work_line_analyze();
} else {
/* 何もしない */
}
} else {
CPX++;
}
work_cursor_cpx();
CX0 = CX;
/*
SKEYSET(0x1e);
fep_INKEY();
*/
}
void
ctrl_g()
{
if (TBUFFC) {
xf_init_tb();
etc_color(NORMAL);
disp_trans_half_flush(TL0,TBP0,TX0,TY0);
} else {
etc_beep();
etc_set_arg(0);
under_print((STR)"[中断]");
if (MACRO_DEF_FLAG) { /* マクロ定義中 */
if (MACRO_COUNT) {
MACRO_SEQUENCE[MACRO_COUNT-1] = 0; /* 自分を消す */
} else {
MACRO_SEQUENCE[0] = 0;
}
MACRO_SEQUENCE[MACRO_COUNT] = MACRO_COUNT = MACRO_DEF_FLAG = 0;
}
}
}
/* BS */
void
ctrl_h() /* ,,, */
{
if (TBUFFC || TBUFFC_R) {
/* xf_cat_r_init(TBUFF,TBUFF_R);*/
xf_delete_tb();
if (TBCP || TBUFFC_R) { /* 生がある */
xf_disp_insert(&TX,&TY);
} else { /* 生が無くなった */
work_replace_str_echo(TL0,TBP0,TL1,TBP1,TBUFF,0,TY0);
xf_init_tb();
etc_color(NORMAL);
disp_half_flush(TL0,TY0);
}
return;
}
if ((CL != (HEAD->ATO)) || CPX) { /* テキストの先頭ではない */
if (CPX) { /* 行頭ではない */
ctrl_b(); /* 左に行って */
ctrl_d(); /* 右側を削除 */
} else { /* 行頭である */
ctrl_b(); /* 前の行の行末へ行く */
if (line_cpx_code() != CR) { /* 改行の上でない */
ctrl_b(); /* もう一回左へ */
}
ctrl_d(); /* 右側を削除 */
}
change_check();
}
}
/* TAB */
void
ctrl_i()
{
register int a;
if (TBUFFC) {
fep_push_key(0x105); /* 暫定 */
return;
}
if (a = etc_get_arg()) {
if ((a <= 0) || (a > TAB_LENGTH_LIMIT)) {
UBYTE w[MAXLINE];
sprintf((char *) w,"タブの設定は 1 から %d までです",TAB_LENGTH_LIMIT);
under_print(w);
} else if (a > CURRENT_JIZUME) {
UBYTE w[MAXLINE];
sprintf((char *) w,"タブの設定は現在のカラム数(%d)以下でなくてはいけません",CURRENT_JIZUME);
under_print(w);
} else if (etc_set_tab(a)) { /* TAB を変更した */
disp_tab_change(a);
ctrl_l();
} else {
under_print((STR)"タブの設定が同じです");
work_cursor_cpx();
return;
}
} else {
work_insert1((UBYTE) TAB);
under_blanc();
}
change_check();
work_cursor_cpx();
}
/* インデント付 CR */
void
ctrl_j()
{
UBYTE lw[VERY_LONG_LINE];
register int i,n;
register UINT c;
extern UBYTE l[VERY_LONG_LINE*4];
xf_ikinari_kakutei();
n = i = 0;
while(1) {
c = line_cl_code(i++);
if ((c == ' ') || (c == '\t')) {
lw[n++] = c;
} else if (c == L' ') {
lw[n++] = (L' ' >> 8);
lw[n++] = (L' ' & 0xff);
} else {
lw[n] = EOS;
break;
}
}
if (n) { /* 何かある */
line_cl_strncpy(l,i = ANALYZE[CPX].BPOS); /* ok */
l[i] = CR;
l[i+1] = EOS;
strcat(l,lw);
line_cl_strcat(l,i); /* ok */
work_cl_replace_plus(i+n+1);
} else { /* ^M と同じ */
work_insert1((UBYTE) CR);
}
work_cursor_cpx();
}
/* カーソルの右側削除 */
/* 正確には、カーソルが改行の上にある時は改行を削除 -> バッファへ */
/* 右に改行がある時は、改行の前までを削除 -> バッファへ */
/* 右に改行がない時は、行末までを削除 -> バッファへ、そして後ろの行からずりずり */
void
ctrl_k()
{
UBYTE c;
int i;
if (commander_is_last_cut_buff_type()) {
} else { /* でなければ、カットバッファをクリア */
buff_clear_cut_buff();
}
c = line_cpx_1byte();
if ((CL != (TAIL->MAE))
|| ((c != EOS) && (c != CR))) {
if (c == CR) { /* CR の上なら吸い込み削除と同じ */
/* ただし、バッファへ送り込む点は違う */
int b1,b2;
b1 = ANALYZE[CPX].BPOS;
b2 = ANALYZE[CPX+1].BPOS;
work_delete_cl_between(b1,b2,1);
} else {
i = work_CX0_to_CPX(VERY_LONG_LINE); /* 行末のカウント */
work_delete_cl_between(ANALYZE[CPX].BPOS,ANALYZE[i].BPOS,1);
}
line_cl_cl();
change_check();
work_line_analyze();
work_cursor_cpx();
CX0 = CX;
} else {
/* 何もしない */
}
}
/* !!! 整行及び再表示 */
void
ctrl_l()
{
register int i;
register UNIT *p;
int x,y;
UBYTE left[VERY_LONG_LINE];
line_seigyou();
init_clear_screen();
for(i=0;i<MAX_WINDOW;i++) {
if (WDATA[i].WTEXTS >= 0) {
disp_btm_line(i);
/* SCREEN[WDATA[i].WY1+1] = NOT; */ /* -1 */
}
}
if (TBUFFC) {
for(i=0;i<TY0;i++) {
if ((p = SCREEN[i]) != NOT) {
disp_1line(i,p);
}
}
line_get_body(left,TL0);
left[TBP0] = EOS; /* 未変換の対象になってない左部分 */
etc_bit_convert_and_disp(0,TY0,left);
/*
window_loc(0,TY0);
disp_convert_and_disp(left);
*/
xf_disp_insert(&x,&y);
} else {
for(i=0;i<YWIDTH-1;i++) {
if ((p = SCREEN[i]) != NOT) {
disp_1line(i,p);
}
}
work_cursor_cpx();
}
}
void
ctrl_m()
{
if (TBUFFC || TBUFFC_R) {
xf_ikinari_kakutei();
return;
}
if (sysflag & 0b1000) { /* 改行モード */
if (BITSNS(0x0e) & 0b00000001) { /* SHIFT */
} else {
if (CMDMOD) { /* ED モードである */
ed_ctrl_x();
} else {
ctrl_n();
}
ctrl_a();
return;
}
}
work_insert1((UBYTE) CR);
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
}
void
ctrl_n()
{
if (TBUFFC || TBUFFC_R) {
xf_ikinari_kakutei();
}
if (CL->ATO != TAIL) {
if ((CY+1) > (CWY1 - CWY0)) { /* ウインドウ外 */
/* 袋を空にし、CL をウインドウの中心-1にして書き直す */
line_seigyou();
disp_cl_center_1();
}
CY++;
CL = CL->ATO;
line_cl_cl();
work_line_analyze();
if (CMDMOD) {
CPX = work_CX0_to_CPX(CX);
} else {
CPX = work_CX0_to_CPX(CX0);
}
work_cursor_cpx();
} else {
/* 何もしない */
}
}
void
ctrl_o()
{
work_insert1_right((UBYTE) CR);
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
}
void
ctrl_p()
{
UNIT *up;
if (TBUFFC || TBUFFC_R) {
xf_ikinari_kakutei();
}
up = CL->MAE;
if (up != HEAD) {
CL = up;
line_cl_cl();
if (--CY < 0) { /* ウインドウ外 */
/* CL をウインドウの中心にして書き直す */
disp_cl_center();
}
work_line_analyze();
if (CMDMOD) {
CPX = work_CX0_to_CPX(CX);
} else {
CPX = work_CX0_to_CPX(CX0);
}
work_cursor_cpx();
} else {
/* 何もしない */
}
}
void
ctrl_q()
{
UINT c;
disp_cursor_on(); /* カーソルを出す */
disp_show_cursor(); /* カーソルのブリンクを強制的にオンにする */
fep_key_clear(); /* キーバッファのクリア */
c = fep_inkey();
if (c < 0x100) {
work_insert1((UBYTE) c);
} else if (c >= 0x8000) {
work_insert2(c);
} /* ファンクションキーを排除するため */
work_cursor_cpx();
}
UBYTE search_w1[VERY_LONG_LINE * 40]; /* サーチの為のワークその位置 */
int bp_bp; /* CL で発見した場合のゲタ */
/* 逆方向次検索 */
void
ctrl_r_next()
{
ctrl_r0(0);
}
/* 逆方向検索 */
void
ctrl_r()
{
ctrl_r0(1);
}
/* 逆方向サーチ */
void
ctrl_r0(int ask)
{
UBYTE w[VERY_LONG_LINE * 4];
register STR p;
etc_string_esc_cnv(STRING_ESC1,STRING_ESC1_s);
sprintf((char *) w,"逆方向検索 [%s]<META>",STRING_ESC1_s);
if (ask && under_input_esc(w,STRING_ESC1) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
} else { /* 検索する */
register UINT p0; /* 1文字目 */
register STR smash;
register UBYTE smashc;
UNIT *up; /* 検索対象行 */
UINT bp; /* 検索対象バイト位置 */
strcpy(STRING_ESC1_u,STRING_ESC1);
etc_jstrup(STRING_ESC1_u);
if (p0 = etc_jfirst(STRING_ESC1_u)) {
line_seigyou(); /* 整行する */
under_print((STR)"[検索中...]");
bp_bp = bp = ANALYZE[CPX].BPOS;
if (bp) {
up = CL;
line_get_body(w,up);
etc_jstrup(w);
w[bp] = EOS;
/* 現在行のカーソル以降を対象から外す */
} else {
if ((up = CL->MAE) == HEAD) { /* 前がない */
/* みつからないわけだ */
goto not_found;
}
line_get_body(w,up);
etc_jstrup(up);
}
smash = NULL;
while(1) {
UBYTE code;
if (((code = fep_get_key()) == '['-'@') || (code == 'G'-'@')) {
etc_beep();
under_print("[中断]");
return;
}
if (p = ctrl_r_search1(p0,w)) { /* p0 を w の中からさがす */
/* 候補が見付かった */
/* w -> search_w1 にメイン文字列だけが行ってる */
/* p がsearch_w1 の中を指している */
if (smash) { /* 検索のため潰してあった */
*smash = smashc; /* 戻す */
smash = NULL;
}
if (ctrl_r_search2(p,up,STRING_ESC1_u)) {
int y;
UNIT *p2;
int b1,b2;
/* 見付かった! */
/* up の中に始まりがある */
/* p - search_w1 を real_byte でトレースするのだ */
/* p1 行の b1 バイト目から、bc バイトをリアルでトレースし、p2, b2 に位置を返す */
ctrl_s_trace_real_byte(up,0,(p - search_w1),&p2,&b2);
CL = up;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CPX = work_byte_to_CPX(b2);
CX0 = CX = ANALYZE[CPX].XPOS;
under_blanc();
if (CPX && (line_cl_1byte(CPX-1) == CR)) {
/* 左が改行 */
if (CL->ATO == TAIL) {
ctrl_b();
} else {
ctrl_f();
}
}
work_cursor_cpx();
under_print((STR)"検索成功");
return;
} else {
/* 2文字目以降のどこかが違うので、p を EOS で潰してから再検索 */
int dummy;
smashc = *(smash = p);
*smash = EOS;
strcpy(w,search_w1);
if (*w) {
/* 残りがあるのでもう一度この行の中で捜す */
continue;
}
}
}
if ((up = up->MAE) == HEAD) { /* 尾なら終わり */
break;
} else { /* 次のデータへ */
line_get_body(w,up);
etc_jstrup(w);
smash = NULL;
}
}
not_found:
under_print((STR)"見付かりません");
} else { /* 検索文字列はヌルだったりして */
under_blanc();
}
}
}
/* p0 を w の中からさがす */
/* 逆方向探査 */
STR
ctrl_r_search1(UINT p0,STR w)
{
if (jstrrchr(w,p0)) { /* まずは下調べ */
/* 見付かったなら */
string_to_main_string(search_w1,w); /* メインの文字列だけにする */
return((STR)jstrrchr(search_w1,p0)); /* ルビなどを外すため */
} else {
return(NULL);
}
}
/* 必要ならば p の後ろに追加した上で比較する */
int
ctrl_r_search2(STR p,UNIT *wp,STR string)
{
register int l0,l1,flag;
register UBYTE c;
UBYTE work0[VERY_LONG_LINE * 4],work1[VERY_LONG_LINE * 4];
l1 = strlen(p);
l0 = strlen(string);
if ((strlen(p) < l0) && (wp == CL)) {
return(0); /* 最初から現在行ならば、追加してはならない */
}
while(strlen(p) < l0) {
if (wp == TAIL) { /* もう追加出来ない */
return(0);
}
wp = wp->ATO;
line_get_body(work0,wp);
etc_jstrup(work0);
if (wp == CL) { /* 現在行を追加するときは */
work0[bp_bp] = EOS; /* カーソル位置までとする */
}
string_to_main_string(work1,work0); /* メインの文字列だけにする */
strcat(p,work1); /* 比較の意味が出るまで追加する */
}
c = p[l0];
p[l0] = EOS;
flag = !strcmp(p,string);
p[l0] = c;
p[l1] = EOS; /* 追加分は取り除く */
return(flag);
}
/* 次サーチ */
void
ctrl_s_next()
{
ctrl_s0(0);
}
/* 順方向サーチ */
void
ctrl_s()
{
ctrl_s0(1);
}
/* 順方向サーチ */
void
ctrl_s0(int ask)
{
UBYTE w[VERY_LONG_LINE * 4];
UNIT *p1,*p2;
int b1,b2;
int flag;
etc_string_esc_cnv(STRING_ESC1,STRING_ESC1_s);
sprintf((char *) w,"検索 [%s]<META>",STRING_ESC1_s);
if (ask && under_input_esc(w,STRING_ESC1) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
} else { /* 検索する */
if (*STRING_ESC1) { /* ちゃんと文字列がある */
line_seigyou(); /* 整行する */
under_print((STR)"[検索中...]");
strcpy(STRING_ESC1_u,STRING_ESC1);
etc_jstrup(STRING_ESC1_u);
flag = ctrl_s_get_string(CL,ANALYZE[CPX].BPOS,STRING_ESC1_u,&p1,&b1,&p2,&b2);
if (flag > 0) {
int y;
CL = p2;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CPX = work_byte_to_CPX(b2);
CX0 = CX = ANALYZE[CPX].XPOS;
under_blanc();
if (CPX && (line_cl_1byte(CPX-1) == CR)) {
/* 左が改行 */
if (CL->ATO == TAIL) {
ctrl_b();
} else {
ctrl_f();
}
}
work_cursor_cpx();
under_print((STR)"検索成功");
} else if (flag) {
under_print((STR)"[中断]");
} else {
under_print((STR)"見付かりません");
}
} else {
under_blanc();
}
}
}
/* 順方向サーチのサブ */
/* pp の bb から捜して、p1, b1, p2, b2 に値を返す */
/* 見付かったかどうかを返す */
int
ctrl_s_get_string(UNIT *pp,int bb,STR ss,UNIT **p1,int *b1,UNIT **p2,int *b2)
{
UBYTE w[VERY_LONG_LINE * 4];
register UNIT *wp;
register STR p;
register UINT p0; /* 1文字目 */
register int count; /* 何個目の p0 か */
UNIT *up; /* 検索対象行 */
UINT bp; /* 検索対象バイト位置 */
int llen,flag;
p0 = etc_jfirst(ss);
up = pp;
wp = pp->ATO;
line_get_body(w,pp);
etc_jstrup(w);
strcpy(w,&w[bp_bp = bp = bb]); /* 探索開始点以後 */
count = 0;
while(1) {
UBYTE code;
if (((code = fep_get_key()) == '['-'@') || (code == 'G'-'@')) {
etc_beep();
return(-1);
}
if (p = ctrl_s_search1(p0,w)) { /* p0 を w の中からさがす */
llen = strlen(w);
count++;
/* 候補が見付かった */
/* w -> search_w1 にメイン文字列だけが行ってる */
/* p がsearch_w1 の中を指している */
if (flag = ctrl_s_search2(p,wp,ss)) {
int y;
/* 見付かった。もしくは終わりにぶつかった */
if (flag < 0) {
return(0);
}
/* up の中に始まりがある */
ctrl_s_search3(up,p0,STRING_ESC1_u,count,b1,p2,b2);
*p1 = up;
return(1);
} else {
/* 2文字目以降のどこかが違うので、p の次から再検索 */
int dummy;
bp = line_touch_next_char_x(p,0,&dummy);
/* ここで wp を更新可能性あり */
strcpy(w,&p[bp]);
if (*w) {
/* 残りがあるのでもう一度この行の中で捜す */
if (llen <= bp) {
wp = wp->ATO;
}
continue;
}
}
}
if (wp == TAIL) { /* 尾なら終わり */
break;
} else { /* 次のデータへ */
line_get_body(w,up = wp);
etc_jstrup(w);
count = bp = 0;
wp = wp->ATO;
}
}
return(0);
}
/* p0 を w の中からさがす */
STR
ctrl_s_search1(UINT p0,STR w)
{
if (jstrchr(w,p0)) { /* まずは下調べ */
/* 見付かったなら */
string_to_main_string(search_w1,w); /* メインの文字列だけにする */
return((STR)jstrchr(search_w1,p0)); /* ルビなどを外すため */
} else {
return(NULL);
}
}
/* p の後ろに追加した上で比較する */
/* 正で発見、零で非発見、負で終端 */
int
ctrl_s_search2(STR p,UNIT *wp,STR string)
{
register int l0,l1,flag;
register UBYTE c;
UBYTE work0[VERY_LONG_LINE * 4],work1[VERY_LONG_LINE * 4];
l1 = strlen(p);
l0 = strlen(string);
while(strlen(p) < l0) {
if (wp == TAIL) {
return(-1);
}
line_get_body(work0,wp);
etc_jstrup(work0);
wp = wp->ATO;
string_to_main_string(work1,work0); /* メインの文字列だけにする */
strcat(p,work1);
}
c = p[l0];
p[l0] = EOS;
flag = !strcmp(p,string);
p[l0] = c;
p[l1] = EOS; /* 追加分は取り除く */
return(flag);
}
/* up から始まるテキストの中から STRING_ESC1_u を捜し(始まりは count 個目の p0) */
/* b1,p2,b2 にその位置を返す */
/* up == CL のときは bp_bp がゲタとなる */
void
ctrl_s_search3(UNIT *up,UINT p0,STR STRING_ESC1_u,int count,int *b1,UNIT **p2,int *b2)
{
register UINT c;
UBYTE s[VERY_LONG_LINE * 4];
register STR tp,begin;
line_get_body(s,up);
etc_jstrup(s);
if ((up == CL) && (bp_bp)) {
tp = s+bp_bp; /* ゲタがある */
} else {
tp = s;
}
while(count--) {
while(1) {
begin = tp; /* チェック開始位置を保存 */
if (c = *tp++) { /* 終了ではない */
if (c == XCODE_UP) {
switch(*tp++) {
case XCODE_MARK+0:
case XCODE_MARK+1:
case XCODE_MARK+2:
case XCODE_MARK+3:
case XCODE_MARK+4:
case XCODE_MARK+5:
case XCODE_MARK+6:
case XCODE_MARK+7:
case XCODE_MARK+8:
case XCODE_MARK+9: /* マーク 0x20 - 0x29 */
case XCODE_MARK+10:
case XCODE_MARK+11:
case XCODE_MARK+12:
case XCODE_MARK+13:
case XCODE_MARK+14:
case XCODE_MARK+15:
case XCODE_SYSMARK+0: /* システムマーク */
case XCODE_SYSMARK+1:
case XCODE_SYSMARK+2:
case XCODE_SYSMARK+3:
case XCODE_SYSMARK+4:
case XCODE_SYSMARK+5:
case XCODE_SYSMARK+6:
case XCODE_SYSMARK+7:
case XCODE_SYSMARK+8:
case XCODE_SYSMARK+9:
case XCODE_SYSMARK+10:
case XCODE_SYSMARK+11:
case XCODE_SYSMARK+12:
case XCODE_SYSMARK+13:
case XCODE_SYSMARK+14:
case XCODE_SYSMARK+15:
break;
case XCODE_UL: /* 下線 */
break;
case XCODE_RB10: /* 予約:1文字真ん中ルビ */
case XCODE_RB1: /* 1文字ルビ */
case XCODE_RB1L: /* 1文字ルビ左(全角用) */
case XCODE_RB1R: /* 1文字ルビ右(全角用) */
tp += 2; /* ルビであるから、2バイト文字 */
break;
case XCODE_RB2: /* 2文字ルビ(全角用) */
tp += 4; /* ルビであるから、2バイト文字 */
}
} else {
if (isprkana(c) || (c < 0x20)) { /* 普通の1バイトコード */
if (p0 == c) {
break;
}
} else { /* 2バイトコード:もしくは拡張 */
c = (c << 8) | (*tp++);
if (p0 == c) {
break;
}
}
}
}
}
}
/* count 個を読み飛ばした */
*b1 = begin - s;
ctrl_s_trace_real_byte(up,*b1,strlen(STRING_ESC1_u),p2,b2);
}
/* p1 行の b1 バイト目から、bc バイトをリアルでトレースし、p2, b2 に位置を返す */
void
ctrl_s_trace_real_byte(UNIT *p1,int b1,int bc,UNIT **p2,int *b2)
{
UBYTE w[VERY_LONG_LINE * 4];
register STR tp;
register UINT c;
if (!bc) {
*p2 = p1;
*b2 = b1;
return;
}
line_get_body(w,p1);
tp = w + b1;
while(1) {
if (c = *tp++) { /* 終了ではない */
if (c == XCODE_UP) {
switch(*tp++) {
case XCODE_MARK+0:
case XCODE_MARK+1:
case XCODE_MARK+2:
case XCODE_MARK+3:
case XCODE_MARK+4:
case XCODE_MARK+5:
case XCODE_MARK+6:
case XCODE_MARK+7:
case XCODE_MARK+8:
case XCODE_MARK+9: /* マーク 0x20 - 0x29 */
case XCODE_MARK+10:
case XCODE_MARK+11:
case XCODE_MARK+12:
case XCODE_MARK+13:
case XCODE_MARK+14:
case XCODE_MARK+15:
case XCODE_SYSMARK+0: /* システムマーク */
case XCODE_SYSMARK+1:
case XCODE_SYSMARK+2:
case XCODE_SYSMARK+3:
case XCODE_SYSMARK+4:
case XCODE_SYSMARK+5:
case XCODE_SYSMARK+6:
case XCODE_SYSMARK+7:
case XCODE_SYSMARK+8:
case XCODE_SYSMARK+9:
case XCODE_SYSMARK+10:
case XCODE_SYSMARK+11:
case XCODE_SYSMARK+12:
case XCODE_SYSMARK+13:
case XCODE_SYSMARK+14:
case XCODE_SYSMARK+15:
break;
case XCODE_UL: /* 下線 */
break;
case XCODE_RB10: /* 予約:1文字真ん中ルビ */
case XCODE_RB1: /* 1文字ルビ */
case XCODE_RB1L: /* 1文字ルビ左(全角用) */
case XCODE_RB1R: /* 1文字ルビ右(全角用) */
tp += 2; /* ルビであるから、2バイト文字 */
break;
case XCODE_RB2: /* 2文字ルビ(全角用) */
tp += 4; /* ルビであるから、2バイト文字 */
}
} else {
if (isprkana(c)|| (c < 0x20)) { /* 普通の1バイトコード */
if (!(--bc)) {
*p2 = p1;
*b2 = tp - w;
return;
}
} else { /* 2バイトコード */
tp++;
if ((bc -= 2) <= 0) {
*p2 = p1;
*b2 = (tp - w);
return;
}
if (bc < 0) {
error("???4");
}
}
}
} else { /* 一行終了 */
p1 = p1->ATO;
if (p1 == TAIL) {
error("???5");
}
line_get_body(w,p1);
tp = w;
}
}
}
/* ARG = 4, *4 ,*4 */
void
ctrl_u()
{
int a;
UINT k;
etc_set_arg(4);
disp_cursor_on(); /* カーソルを出す */
disp_show_cursor(); /* カーソルのブリンクを強制的にオンにする */
fep_key_clear(); /* キーバッファのクリア */
k = fep_under_inkey();
while(k == ('U' - '@')) { /* またしても CTRL-U であった */
if (!(a = etc_get_arg())) {
a = 1;
}
etc_set_arg(a *4);
k = fep_under_inkey();
}
fep_push_key(k); /* 戻す */
}
/* ワイプ */
/* 指定区間を削除してカットバッファへ */
void
ctrl_w()
{
UNIT *wp;
int bp;
int y;
int a;
if (commander_is_last_cut_buff_type()) {
} else { /* でなければ、カットバッファをクリア */
buff_clear_cut_buff();
}
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((STR)"マーク番号が不適当です");
return;
}
line_seigyou();
if (wp = mark_get_mark(a,&bp)) {
if ((wp != CL) || (bp != ANALYZE[CPX].BPOS)) {
change_check();
}
work_delete_to_cut_buff(wp,bp,CL,ANALYZE[CPX].BPOS);
work_cursor_cpx();
} else {
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
/* yank... */
void
ctrl_y()
{
int i,c = 0,len;
int bc,ml;
UNIT *wp,*cp;
UBYTE w0[VERY_LONG_LINE];
line_seigyou();
line_cl_strncpy(w0,i = ANALYZE[CPX].BPOS); /* 左側をコピー */
w0[i] = EOS; /* w0 にカーソルの前までを転送 */
if ((wp = CL->MAE) && (wp != HEAD)) { /* 前の実体がある */
UBYTE w00[VERY_LONG_LINE];
int w00l;
line_get_body(w00,wp);
w00l = wp->LENGTH;
c = work_make_cut_buff0_list(w00,w0,&CL_DATA[i]);
if (w00l -= strlen(w00)) {
c += w00l;
line_store_and_echo(wp,w00);
} else {
/* 何もしない */
}
} else {
c = work_make_cut_buff0_list((STR)NULL,w0,&CL_DATA[i]);
}
/* -1 = 空、さもなくば、CUT_BUFF の総バイト長を返す */
if (c < 0) return;
change_check();
if (!(wp = work_get_from_cut_buff0_list())) { /* 一行持って来る */
/* 何もない */
return;
}
line_get_body(w0,wp); /* 中身を取り出す */
if (wp->ATO == NIL) { /* 次は無い */
line_set_free(wp); /* ユニットは捨てる */
/* cp の行頭に w0 を挿入する */
/* up の指す行の行頭に s1+s2 を挿入し、次々に送って行く。最後まで勝負する */
/* エコーする */
line_store_and_echo(CL,w0); /* 現在行と取り換える */
CL = line_trace_byte(CL,i,c,&bc,&ml);
} else {
line_store_and_echo(CL,w0); /* 現在行と取り換える */
line_set_free(wp); /* 最初の行は捨てる */
cp = CL->ATO;
while(wp = work_get_from_cut_buff0_list(),wp->ATO) { /* 最後の一つ前まで */
line_insert1_mae_echo(wp,cp);
}
/* 最後の行だ */
line_get_body(w0,wp); /* 中身を取り出す */
line_set_free(wp); /* ユニットは捨てる */
/* cp の行頭に w0 を挿入する */
/* up の指す行の行頭に s1+s2 を挿入し、次々に送って行く。最後まで勝負する */
/* エコーする */
line_arrange(cp,w0,(STR)"");
CL = line_trace_byte(CL,i,c,&bc,&ml);
}
if ((CY = window_is_this_line_in_current(CL)) < 0) {
disp_cl_center();
}
line_cl_cl();
work_line_analyze();
CPX = work_byte_to_CPX(bc);
CX0 = CX = ANALYZE[CPX].XPOS;
if (CPX && (line_cl_1byte(CPX-1) == CR)) { /* 左が改行 */
if (CL->ATO == TAIL) {
ctrl_b();
} else {
ctrl_f();
}
}
work_cursor_cpx();
}
#if 1
/* next page */
void
ctrl_v()
{
ctrl_v1((CWY1-CWY0)-1-CY,1);
}
void
ctrl_v1(int n,int flag)
{
int y;
if (CL != TAIL->MAE) { /* 最後端ではない */
CL = line_trace(CL,max(n,1),(INT *) NIL);
/* 現在表示されている下から2行目(かも) */
if ((CY = window_is_this_line_in_current(CL)) < 0) { /* 出た */
/* 画面の書き換えをする */
line_seigyou();
disp_cl_y(CY = 0);
} else { /* 入っている */
if (flag) {
if (CL->ATO != TAIL) { /* 画面の書き換えをする */
line_seigyou();
disp_cl_y(CY = 0);
}
}
}
line_cl_cl();
work_line_analyze();
CX0 = CPX = 0;
work_cursor_cpx();
} else {
ctrl_e();
}
}
/* before page */
void
ctrl_z()
{
ctrl_z0(-(CY -1 +(CWY1-CWY0)));
}
void
ctrl_z0(int n)
{
if (CL != HEAD->ATO) { /* 最先端ではない */
CL = line_trace(CL,min(n,-1),(INT *) NIL);
if ((CY = window_is_this_line_in_current(CL)) < 0) { /* 入っているか */
line_seigyou(); /* 入ってないなら画面書き換え */
disp_cl_y(CY = 0);
} else { /* カーソルの移動だけである */
CY = window_is_this_line_in_current(CL);
}
line_cl_cl();
work_line_analyze();
CX0 = CPX = 0;
work_cursor_cpx();
} else {
ctrl_a();
}
}
#else
/* next page */
void
ctrl_v()
{
int y;
if (CL != TAIL->MAE) { /* 最後端ではない */
CL = line_trace(CL,(CWY1-CY)+((CWY1-CWY0-1)/2),(INT *) NIL); /* 2行跨り */
ctrl_vz_sub();
} else {
ctrl_e();
}
}
/* before page */
void
ctrl_z()
{
if (CL != HEAD->ATO) { /* 最先端ではない */
CL = line_trace(CL,-(CY)-((CWY1-CWY0-1)/2),(INT *) NIL); /* 2行跨り */
ctrl_vz_sub();
} else {
ctrl_a();
}
}
void
ctrl_vz_sub()
{
int y;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
line_seigyou();
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CX0 = CPX = 0;
work_cursor_cpx();
}
#endif
/* 生入力キャンセル */
void
ctrl_ubar()
{
if (TBUFFC || TBUFFC_R) {
*TBUFF = EOS;
TBUFFC = TBCP = 0;
work_replace_str_echo(TL0,TBP0,TL1,TBP1,"",0,TY0);
xf_init_tb();
etc_func_on(); /* 数字選択状態から脱出 */
disp_top_flush(TTOPL00);
CL = TL00;
CPX = TPX00;
CX = TX00;
CY = TY00;
etc_trim_tail();
line_cl_cl();
work_line_analyze();
}
}
extern COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
extern COMMAND_UNIT command_table0[MAX_COMMAND_NUMBER]; /* ME */
extern COMMAND_UNIT command_table1[MAX_COMMAND_NUMBER]; /* ED */
extern COMMAND_UNIT command_table00[MAX_COMMAND_NUMBER]; /* ME */
extern COMMAND_UNIT command_table10[MAX_COMMAND_NUMBER]; /* ED */
/* キーバインド初期化 */
void
ctrl_shift_help()
{
register int i;
if (CMDMOD) { /* ed である */
ctrl_t_ed0();
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
command_table[i] = command_table10[i];
}
under_print("キーバインドをオリジナルの ED モードにしました");
} else { /* me である */
ctrl_t_me0();
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
command_table[i] = command_table00[i];
}
under_print("キーバインドをオリジナルの ME モードにしました");
}
etc_kb_wash();
}
/* 逆方向サーチのサブ */
/* pp の bb から ss を捜して、p1, b1, p2, b2 に値を返す */
/* 見付かったかどうかを返す */
int
ctrl_r_get_string(UNIT *pp,int bb,STR ss,UNIT **p1,int *b1,UNIT **p2,int *b2)
{
UBYTE w[VERY_LONG_LINE * 4];
register STR p;
register UINT p0; /* 1文字目 */
register STR smash;
register UBYTE smashc;
UNIT *up; /* 検索対象行 */
UINT bp; /* 検索対象バイト位置 */
p0 = etc_jfirst(ss);
bp = bb;
up = pp;
if (bp) {
line_get_body(w,up);
etc_jstrup(w);
w[bp] = EOS;
/* bb 以降を対象から外す */
} else {
if ((pp->MAE) == HEAD) { /* 前がない */
/* みつからないわけだ */
goto not_found;
}
line_get_body(w,up);
etc_jstrup(w);
}
smash = NULL;
while(1) {
UBYTE code;
if (((code = fep_get_key()) == '['-'@') || (code == 'G'-'@')) {
etc_beep();
return(-1);
}
if (p = ctrl_r_search1(p0,w)) { /* p0 を w の中からさがす */
/* 候補が見付かった */
/* w -> search_w1 にメイン文字列だけが行ってる */
/* p がsearch_w1 の中を指している */
if (smash) { /* 検索のため潰してあった */
*smash = smashc; /* 戻す */
smash = NULL;
}
if (ctrl_r_search2(p,up,STRING_ESC1_u)) {
int y;
/* 見付かった! */
/* up の中に始まりがある */
/* p - search_w1 を real_byte でトレースするのだ */
/* p1 行の b1 バイト目から、bc バイトをリアルでトレースし、p2, b2 に位置を返す */
ctrl_s_trace_real_byte(up,0,(p - search_w1),p1,b1);
ctrl_s_trace_real_byte(*p1,*b1,strlen(STRING_ESC1_u),p2,b2);
return(1);
} else {
/* 2文字目以降のどこかが違うので、p を EOS で潰してから再検索 */
int dummy;
smashc = *(smash = p);
*smash = EOS;
strcpy(w,search_w1);
if (*w) {
/* 残りがあるのでもう一度この行の中で捜す */
continue;
}
}
}
if ((up = up->MAE) == HEAD) { /* 尾なら終わり */
break;
} else { /* 次のデータへ */
line_get_body(w,up);
etc_jstrup(w);
smash = NULL;
}
}
not_found:
return(0);
}
/* p1 行の b1 バイト目から、bc バイトをリアルでトレースし、p2, b2 に位置を返す */
void
ctrl_r_trace_real_byte(UNIT *p1,int b1,int bc,UNIT **p2,int *b2)
{
UBYTE w[VERY_LONG_LINE * 4];
register STR tp;
register UINT c;
if (!bc) {
*p2 = p1;
*b2 = b1;
return;
}
line_get_body(w,p1);
tp = w + b1;
while(1) {
if (c = *tp++) { /* 終了ではない */
if (c == XCODE_UP) {
switch(*tp++) {
case XCODE_MARK+0:
case XCODE_MARK+1:
case XCODE_MARK+2:
case XCODE_MARK+3:
case XCODE_MARK+4:
case XCODE_MARK+5:
case XCODE_MARK+6:
case XCODE_MARK+7:
case XCODE_MARK+8:
case XCODE_MARK+9: /* マーク 0x20 - 0x29 */
case XCODE_MARK+10:
case XCODE_MARK+11:
case XCODE_MARK+12:
case XCODE_MARK+13:
case XCODE_MARK+14:
case XCODE_MARK+15:
case XCODE_SYSMARK+0: /* システムマーク */
case XCODE_SYSMARK+1:
case XCODE_SYSMARK+2:
case XCODE_SYSMARK+3:
case XCODE_SYSMARK+4:
case XCODE_SYSMARK+5:
case XCODE_SYSMARK+6:
case XCODE_SYSMARK+7:
case XCODE_SYSMARK+8:
case XCODE_SYSMARK+9:
case XCODE_SYSMARK+10:
case XCODE_SYSMARK+11:
case XCODE_SYSMARK+12:
case XCODE_SYSMARK+13:
case XCODE_SYSMARK+14:
case XCODE_SYSMARK+15:
break;
case XCODE_UL: /* 下線 */
break;
case XCODE_RB10: /* 予約:1文字真ん中ルビ */
case XCODE_RB1: /* 1文字ルビ */
case XCODE_RB1L: /* 1文字ルビ左(全角用) */
case XCODE_RB1R: /* 1文字ルビ右(全角用) */
tp += 2; /* ルビであるから、2バイト文字 */
break;
case XCODE_RB2: /* 2文字ルビ(全角用) */
tp += 4; /* ルビであるから、2バイト文字 */
}
} else {
if (isprkana(c)|| (c < 0x20)) { /* 普通の1バイトコード */
if (!(--bc)) {
*p2 = p1;
*b2 = tp - w;
return;
}
} else { /* 2バイトコード */
tp++;
if ((bc -= 2) <= 0) {
*p2 = p1;
*b2 = (tp - w);
return;
}
if (bc < 0) {
error("???6");
}
}
}
} else { /* 一行終了 */
p1 = p1->ATO;
if (p1 == TAIL) {
error("???7");
}
line_get_body(w,p1);
tp = w;
}
}
}